package com.cnofd.demo;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.cnofd.agent.OfdCreateAgent;
import com.cnofd.ofd.model.ResultInfo;
import com.cnofd.ofd.model.ImageModel;

/**
 * @ClassName: OfdCreateAgentTest
 * @Description: OFD生成功能测试
 * @author cnofd
 * @date 2022年1月22日
 */
public class OfdCreateAgentTest {
    private static final Logger logger = LoggerFactory.getLogger(OfdCreateAgentTest.class);

    private static String cfgDataBasePath;
    private static String sDataPath;
    private static String sOutPath;

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        logger.info("01-启动：" + System.currentTimeMillis());

        // 读取配置文件，SDK初始化处理
        SdkInit.getInstance();
        // 获取测试数据目录
        cfgDataBasePath = SdkInit.getDataBasePath();

        logger.info("02-完成初始化：" + (System.currentTimeMillis() - start));

        sDataPath = cfgDataBasePath;
        sOutPath = cfgDataBasePath + "OfdCreate/";

        // 基于底图文件生成OFD（以结婚证为例，单一A4版面）
        ofdCreateOne();

        //基于图片生成OFD文件
        OfdCreateByImage();

        // 套模板生成OFD文件：基于图片文件或背景色+form.xml生成底版OFD
        OfdCreateByTemplateTest1();

        // 套模板生成OFD文件：底图路径+样式生成底版OFD，form.xml内含页面尺寸和底图文件等信息，data文件采用name结构
        OfdCreateByTemplateTest2();

        // 套模板生成OFD文件：基于OFD生成底版OFD
        OfdCreateByTemplateTest3();

        // 套模板生成OFD文件：单步生成OFD文件，form.xml内含页面尺寸和底图文件信息，data文件采用name结构
        OfdCreateByTemplateTest4();

        // 套模板生成OFD文件：底版OFD复用，支持模板页复用
        OfdCreateByTemplateTest5();
    }

    /**
     * 基于底图文件生成OFD（以结婚证为例，单一A4版面）
     */
    public static void ofdCreateOne() {
        long start = System.currentTimeMillis();
        logger.info("01-开始测试：" + System.currentTimeMillis());

        try {
            ResultInfo result = new ResultInfo();

            // 背景图片
            List<ImageModel> images = new ArrayList<ImageModel>();
            images.add(new ImageModel(210f, 297f, "jpg", "1", Paths.get(sDataPath + "temp1.jpg").toAbsolutePath()));

            File fFormOfd = new File(sOutPath + "form.ofd");

            File fileParent = fFormOfd.getParentFile();
            if (!fileParent.exists()) {
                fileParent.mkdirs();
            }

            OutputStream fosFormOfd = new FileOutputStream(fFormOfd);

            logger.info("03-开始生成底版OFD：" + (System.currentTimeMillis() - start));
            // 基于图片文件生成底版OFD
            result = OfdCreateAgent.imageToTemplate(images, fosFormOfd);

            fosFormOfd.close();

            if (result.getStatus() == 0) {
                logger.info("03-结束生成底版OFD：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("03-失败生成底版OFD：" + result.getMessage());
                return;
            }

            logger.info("04-开始生成版式文件：" + (System.currentTimeMillis() - start));
            // 套模板转换生成ofd
            result = OfdCreateAgent.createOfdByTemplate(sOutPath + "form.ofd", // 底版OFD文件
                    sDataPath + "form-standard.xml", // 表单XML文件
                    sDataPath + "data-standard.xml", // 数据XML文件
                    "name", // 数据结构类型：name结构、xpath结构
                    sDataPath + "customDatas.xml", // 元数据XML文件
                    sOutPath + "cnofd-result-standard.ofd"); // 输出OFD文件
            logger.info("04-结束生成版式文件：" + (System.currentTimeMillis() - start) + result.getMessage());

            fFormOfd.delete();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //
        }
    }

    /**
     * 基于图片文件生成OFD
     */
    //基于图片文件生成OFD
    public static void OfdCreateByImage() {
        long start = System.currentTimeMillis();
        logger.info("01-开始测试：" + System.currentTimeMillis());

        logger.info("02-完成初始化：" + (System.currentTimeMillis() - start));
        start = System.currentTimeMillis();

        try {
            ResultInfo result = new ResultInfo();

            List<ImageModel> images = new ArrayList<ImageModel>();
            images.add(new ImageModel(210f, 297f, "jpg", "1", Paths.get(sDataPath + "temp1.jpg").toAbsolutePath()));
            images.add(new ImageModel(200f, 200f, "jpg", "1", Paths.get(sDataPath + "temp2.jpg").toAbsolutePath()));
            images.add(new ImageModel(297, 210f, "255 192 0", "255")); // 背景色

            logger.info("03-开始基于图片生成版式文件：" + (System.currentTimeMillis() - start));
            // 基于图片生成OFD文件
            result = OfdCreateAgent.imageToOfd(images, // 图片文件
                    sDataPath + "customDatas.xml", // 元数据xml文件
                    sOutPath + "cnofd-result-byimage.ofd"); // 输出ofd文件

            if (result.getStatus() == 0) {
                logger.info("04-结束基于图片生成版式文件：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("04-失败基于图片生成版式文件：" + result.getMessage());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //
        }
    }

    /**
     * 套模板生成OFD文件：基于图片文件或背景色生成底版OFD，data文件采用xpath结构
     */
    public static void OfdCreateByTemplateTest1() {
        long start = System.currentTimeMillis();
        logger.info("01-开始测试：" + System.currentTimeMillis());

        logger.info("02-完成初始化：" + (System.currentTimeMillis() - start));
        start = System.currentTimeMillis();

        try {
            ResultInfo result = new ResultInfo();

            List<ImageModel> images = new ArrayList<ImageModel>();
            images.add(new ImageModel(210f, 297f, "jpg", "1", Paths.get(sDataPath + "temp1.jpg").toAbsolutePath()));
            images.add(new ImageModel(200f, 200f, "jpg", "1", Paths.get(sDataPath + "temp2.jpg").toAbsolutePath()));
            /*
             * //读取背景图片文件到缓存图像对象 File fileImage1 = new File(sDataPath +
             * "temp1.jpg"); BufferedImage bi1 = ImageIO.read(fileImage1);
             * images.add(new ImageModel(210f,297f, "jpg", "1", bi1));
             * 
             * File fileImage2 = new File(sDataPath + "temp2.jpg");
             * BufferedImage bi2 = ImageIO.read(fileImage2); images.add(new
             * ImageModel(200f,200f, "jpg", "2", bi2));
             */
            images.add(new ImageModel(297, 210f, "255 192 0", "255")); // 背景色

            File fFormOfd = new File(sOutPath + "form.ofd");
            OutputStream fosFormOfd = new FileOutputStream(fFormOfd);

            logger.info("03-开始生成底版OFD：" + (System.currentTimeMillis() - start));
            // 基于图片文件或背景色生成底版OFD
            result = OfdCreateAgent.imageToTemplate(images, fosFormOfd);

            fosFormOfd.close();

            if (result.getStatus() == 0) {
                logger.info("03-结束生成底版OFD：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("03-失败生成底版OFD：" + result.getMessage());
                return;
            }

            logger.info("04-开始生成OFD文件：" + (System.currentTimeMillis() - start));
            // 套模板转换生成ofd
            result = OfdCreateAgent.createOfdByTemplate(sOutPath + "form.ofd", // 底版OFD文件
                    sDataPath + "form.xml", // 表单XML文件
                    sDataPath + "data.xml", // 数据XML文件
                    "xpath", // 数据结构类型：name结构、xpath结构
                    sDataPath + "customDatas.xml", // 元数据XML文件
                    sOutPath + "cnofd-result-1.ofd"); // 输出OFD文件

            if (result.getStatus() == 0) {
                logger.info("04-结束生成OFD文件：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("04-失败生成OFD文件：" + result.getMessage());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //
        }
    }

    /**
     * 套模板生成OFD文件：底图路径+样式生成底版OFD，form.xml内含页面尺寸和底图文件等信息，data文件采用name结构
     */
    public static void OfdCreateByTemplateTest2() {
        long start = System.currentTimeMillis();
        logger.info("01-开始测试：" + System.currentTimeMillis());

        logger.info("02-完成初始化：" + (System.currentTimeMillis() - start));
        start = System.currentTimeMillis();

        try {
            ResultInfo result = new ResultInfo();

            File fFormOfd = new File(sDataPath + "form.ofd");
            OutputStream fosFormOfd = new FileOutputStream(fFormOfd);

            Path pathForm = Paths.get(sDataPath + "formNew.xml").toAbsolutePath();
            InputStream fisFormXml = new FileInputStream(pathForm.toFile());

            logger.info("03-开始生成底版OFD：" + (System.currentTimeMillis() - start));
            // 基于底图路径+样式生成底版OFD，form.xml内含页面尺寸和底图文件等信息
            result = OfdCreateAgent.imageToTemplate(sDataPath, fisFormXml, fosFormOfd);

            fosFormOfd.close();

            if (result.getStatus() == 0) {
                logger.info("03-结束生成底版OFD：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("03-失败生成底版OFD：" + result.getMessage());
                return;
            }

            logger.info("04-开始生成OFD文件：" + (System.currentTimeMillis() - start));
            // 套模板转换生成ofd
            result = OfdCreateAgent.createOfdByTemplate(sDataPath + "form.ofd", // 底版OFD文件
                    sDataPath + "formNew.xml", // 表单XML文件
                    sDataPath + "dataNew.xml", // 数据XML文件
                    "name", // 数据结构类型：name结构、xpath结构
                    sDataPath + "customDatas.xml", // 元数据XML文件
                    sOutPath + "cnofd-result-2.ofd"); // 输出OFD文件

            if (result.getStatus() == 0) {
                logger.info("04-结束生成OFD文件：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("04-失败生成OFD文件：" + result.getMessage());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //
        }
    }

    /**
     * 套模板生成OFD文件：基于OFD生成底版OFD
     */
    public static void OfdCreateByTemplateTest3() {
        long start = System.currentTimeMillis();
        logger.info("01-开始测试：" + System.currentTimeMillis());

        logger.info("02-完成初始化：" + (System.currentTimeMillis() - start));
        start = System.currentTimeMillis();

        try {
            ResultInfo result = new ResultInfo();

            logger.info("03-开始生成底版OFD：" + (System.currentTimeMillis() - start));
            // 基于OFD生成底版OFD
            result = OfdCreateAgent.ofdToTemplate(sDataPath + "底图+表格3.ofd", sOutPath + "form.ofd");
            // 使用福昕OFD软件，把Word打印成Ofd，已经是模板OFD，可以直接使用。

            if (result.getStatus() == 0) {
                logger.info("03-结束生成模板文件：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("03-失败生成模板文件：" + result.getMessage());
                return;
            }

            logger.info("04-开始生成OFD文件：" + (System.currentTimeMillis() - start));
            // 套模板转换生成ofd
            result = OfdCreateAgent.createOfdByTemplate(sOutPath + "form.ofd", // 底版OFD文件
                    sDataPath + "form.xml", // 表单XML文件
                    sDataPath + "data.xml", // 数据XML文件
                    "xpath", // 数据结构类型：name结构、xpath结构
                    sDataPath + "customDatas.xml", // 元数据XML文件
                    sOutPath + "cnofd-result-3.ofd"); // 输出OFD文件

            if (result.getStatus() == 0) {
                logger.info("04-结束生成OFD文件：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("04-失败生成OFD文件：" + result.getMessage());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //
        }
    }

    /**
     * 套模板生成OFD文件：单步生成OFD文件，form.xml内含页面尺寸和底图文件信息，data文件采用name结构
     */
    public static void OfdCreateByTemplateTest4() {
        long start = System.currentTimeMillis();
        logger.info("01-开始测试：" + System.currentTimeMillis());

        logger.info("02-完成初始化：" + (System.currentTimeMillis() - start));
        start = System.currentTimeMillis();

        try {
            ResultInfo result = new ResultInfo();

            logger.info("03-开始生成OFD文件：" + (System.currentTimeMillis() - start));
            // 单步生成OFD文件
            result = OfdCreateAgent.createOfd(sDataPath, // 底图文件目录
                    new FileInputStream(sDataPath + "formNew.xml"), // 表单XML文件（模板页复用）
                    new FileInputStream(sDataPath + "dataNew.xml"), // 数据XML文件（name结构）
                    "name", // 数据结构类型：name结构、xpath结构
                    sDataPath + "customDatas.xml", // 元数据XML文件
                    sOutPath + "cnofd-result-4.ofd"); // 输出OFD文件

            if (result.getStatus() == 0) {
                logger.info("04-结束生成OFD文件：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("04-失败生成OFD文件：" + result.getMessage());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //
        }
    }

    /**
     * 套模板生成OFD文件：底版OFD复用，支持模板页复用
     */
    public static void OfdCreateByTemplateTest5() {
        long start = System.currentTimeMillis();
        logger.info("01-开始测试：" + System.currentTimeMillis());

        logger.info("02-完成初始化：" + (System.currentTimeMillis() - start));
        start = System.currentTimeMillis();

        try {
            ResultInfo result = new ResultInfo();

            logger.info("03-开始生成OFD文件：" + (System.currentTimeMillis() - start));
            // 套模板转换生成ofd
            result = OfdCreateAgent.createOfdByTemplate(sOutPath + "form.ofd", // 底版OFD文件
                    new FileInputStream(sDataPath + "formNew2.xml"), // 表单XML文件（模板页复用）
                    new FileInputStream(sDataPath + "dataNew.xml"), // 数据XML文件（name结构）
                    "name", // 数据结构类型：name结构、xpath结构
                    sDataPath + "customDatas.xml", // 元数据XML文件
                    sOutPath + "cnofd-result-5.ofd"); // 输出OFD文件

            if (result.getStatus() == 0) {
                logger.info("04-结束生成OFD文件：" + (System.currentTimeMillis() - start));
            } else {
                logger.info("04-失败生成OFD文件：" + result.getMessage());
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //
        }
    }
}